﻿#include "UI.h"

#include <graphics.h>
#include <string>
#include <Windows.h> // 需要包含 Windows.h 头文件

// 将 std::string (UTF-8) 转换为 std::wstring (UTF-16)
std::wstring string_to_wstring(const std::string& str) {
    if (str.empty()) return L"";

    // 获取所需缓冲区大小
    int size_needed = MultiByteToWideChar(
        CP_UTF8,            // 源编码为 UTF-8
        0,                  // 转换选项
        str.c_str(),        // 源字符串
        (int)str.size(),    // 源字符串长度
        nullptr,            // 不接收输出
        0                   // 查询所需缓冲区大小
    );

    if (size_needed <= 0) {
        // 转换失败，返回空字符串
        return L"";
    }

    // 创建足够大的缓冲区
    std::wstring wstr(size_needed, 0);

    // 执行实际转换
    MultiByteToWideChar(
        CP_UTF8,
        0,
        str.c_str(),
        (int)str.size(),
        &wstr[0],
        size_needed
    );

    return wstr;
}


// UIElement 构造函数
UIElement::UIElement(int xPos, int yPos, int w, int h, const std::string& txt)
    : x(xPos), y(yPos), width(w), height(h), text(txt) {}

// 判断 UI 元素是否被点击
bool UIElement::isClicked(int mouseX, int mouseY) {
    return visible && mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height;
}

// 按钮绘制方法
void Button::draw() {
    setfillcolor(fillColor);
    fillrectangle(x, y, x + width, y + height);
    settextcolor(textColor);
    std::wstring wfontName = string_to_wstring(fontName);
    std::wstring wtext = string_to_wstring(text);
    settextstyle(fontSize, 0,  wfontName.c_str());
    int tx = x + (width - textwidth(wtext.c_str())) / 2;
    int ty = y + (height - textheight(wtext.c_str())) / 2;
    outtextxy(tx, ty, wtext.c_str());
}

// 文本框绘制方法
void TextBox::draw() {
    setfillcolor(fillColor);
    fillrectangle(x, y, x + width, y + height);
    settextcolor(textColor);
    std::wstring wfontName = string_to_wstring(fontName);
    std::wstring wtext = string_to_wstring(text);
    settextstyle(fontSize, 0, wfontName.c_str());
    int tx = x + (width - textwidth(wtext.c_str())) / 2;
    int ty = y + (height - textheight(wtext.c_str())) / 2;
    outtextxy(tx, ty, wtext.c_str());
}

// 添加 UI 元素到布局管理器
void UILayoutManager::addElement(UIElement* element) {
    elements.push_back(element);
}

// 绘制所有可见的 UI 元素
void UILayoutManager::drawAll() {
    for (auto element : elements) {
        if (element->visible) {
            element->draw();
        }
    }
}

// 获取被点击的 UI 元素
UIElement* UILayoutManager::getClickedElement(int mouseX, int mouseY) {
    for (auto element : elements) {
        if (element->isClicked(mouseX, mouseY)) {
            return element;
        }
    }
    return nullptr;
}

// UI 事件处理类构造函数
UIEventHandler::UIEventHandler(UILayoutManager& manager) : layoutManager(manager) {}

// 处理鼠标点击事件
void UIEventHandler::handleMouseClick(int mouseX, int mouseY) {
    UIElement* clickedElement = layoutManager.getClickedElement(mouseX, mouseY);
    if (clickedElement) {
        Button* button = dynamic_cast<Button*>(clickedElement);
        if (button && button->clickCallback) {
            button->clickCallback();
        }
    }
}